package com.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.core.task.TaskExecutor;
import org.springframework.transaction.event.TransactionalEventListener;

/**
 * <pre>
 * 1、spring容器在创建bean的过程中，会判断bean是否为 ApplicationListener 类型，进而会将其作为监听器注册到 
 * AbstractApplicationContext#applicationEventMulticaster 中
 * org.springframework.context.support.ApplicationListenerDetector#postProcessAfterInitialization
 * 2、EventListenerMethodProcessor实现了SmartInitializingSingleton接口，
 * SmartInitializingSingleton接口中的 afterSingletonsInstantiated 
 * 方法会在所有单例的bean创建完成之后被spring容器调用
 * 
 * 如果使用 @TransactionalEventListener 注解情关闭掉这个异步配置,这个注解只有在同步方式下才会生效使用回调方式
 * </pre>
 * 
 */
//@Configuration
public class ApplicationEventConfig {

    /**
     * 此处会将EventListener的onApplicationEvent方法一步处理,否则默认同步处理
     * 
     * @return
     */
    @Bean
    public ApplicationEventMulticaster applicationEventMulticaster(TaskExecutor taskExecutor) {
        // 创建一个事件广播器
        SimpleApplicationEventMulticaster result = new SimpleApplicationEventMulticaster();
        // 给广播器提供一个线程池，通过这个线程池来调用事件监听器
        // 设置异步执行器
        result.setTaskExecutor(taskExecutor);
        return result;
    }
}
